#使用模块实现单例
class A():
    def foo(self):
        pass
a = A()
#再新建.py文件导入模块执行
from danli import a
a.foo()

#__new__方法实现单例模式
class B():
    _instance = False  #私有变量
    def __new__(cls, *args, **kwargs):  #重写new方法
        if cls._instance == False:
            cls._instance = super().__new__(cls)  #创建实例
        return cls._instance

a1 = B()
a2 = B()
print(a1)
print(a2)
print(id(a1) == id(a2))

#装饰器实现单例模式
def singleton(cls, *args, **kwargs):  #定义装饰器
    instance = {}  #创建字典保存单例
    def _instance():
        if cls not in instance: #判断字典中是否含有单例
            instance[cls] = cls(*args, *kwargs) #没有单例就创建保存到字典中
        return instance[cls]
    return _instance

@singleton  #使用装饰器
class Test:
    def __init__(self):
        pass

test1 = Test()
test2 = Test()
print(test1)
print(test2)

